package com.momo.hr.task;

import com.momo.hr.bean.Employee;
import com.momo.hr.bean.MailConstants;
import com.momo.hr.bean.MailSendLog;
import com.momo.hr.service.EmployeeService;
import com.momo.hr.service.MailSendLogService;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

/**
 * 使用Scheduled 来提高 RabbitMQ的高可用
 */
@Component
public class MailTask {

    @Autowired
    MailSendLogService mailSendLogService;

    @Autowired
    RabbitTemplate rabbitTemplate;

    @Autowired
    EmployeeService employeeService;

    //这里是Cron表达式 表示为 10秒 分 小时 日 月 星期
    @Scheduled(cron = "0/10 * * * * ?")
    public void mailResendTask(){
        //查询需要处理的表
        List<MailSendLog> mailSendLogsByStatus = mailSendLogService.getMailSendLogsByStatus();
        if (mailSendLogsByStatus == null || mailSendLogsByStatus.size() == 0) {
            return;
        }
        mailSendLogsByStatus.forEach(mailSendLog -> {
            if(mailSendLog.getCount() >= 3){//如果发送的此时超过了3次数 ，那把当前这个消息的状态改为2【表示发送了错误】
                mailSendLogService.updateMailSendLogStatus(mailSendLog.getMsgId(),2);
            } else {
                mailSendLogService.updateCount(mailSendLog.getMsgId(),new Date());
                //投递消息
                //1、去除对应的员工消息
                Employee employeeById = employeeService.getEmployeeById(mailSendLog.getEmpId());
                this.rabbitTemplate.convertAndSend(
                        MailConstants.MAIL_EXCHANGE_NAME,//交换机名字
                        MailConstants.MAIL_ROUTING_KEY_NAME,//路由地址
                        employeeById,//发送的数据
                        new CorrelationData(mailSendLog.getMsgId()));//消息的唯一表示，这里我们是以UUID来使用的
            }
        });

    }
}
